/*
 * @File:
 * @Author: sjk
 * @Date: 2022-02-27 08:58:46
 * @LastEditTime 2022-06-13 11:32:27
 * @Brief:一些全局预定义
 * @Note:
 * 涉及OLED、限幅、....
 */
#ifndef __GLOBAL_DEFINE_H
    #define __GLOBAL_DEFINE_H

    #include <stdio.h> //sprintf()外定义
    //#include "include.h"

    //限制PWM输出
    extern u16 Motor_pwmMax;
    extern u8 Stop_Time;

    /*--------------------------- 显示相关 ------------------------------*/
    extern char txt[32]; //定义在main.c
    extern void OLED_P6x8Str(unsigned char x, unsigned char y, char ch[]);
    extern void OLED_P8x16Str(unsigned char x, unsigned char y, char ch[]);

    /*--------------------------- TFT显示 ------------------------------*/
    #define TFTprint(x, y, t) TFTSPI_P8X16Str(y, x, t, u16PURPLE, u16BLACK)
    #define TFTsprint(x, y, t, var) \
        sprintf(txt, t, var);       \
        TFTSPI_P8X16Str(y, x, txt, u16PURPLE, u16BLACK)

    /*--------------------------- OLED显示 ------------------------------*/
    #define OLEDp(y, t)         OLEDprint(0, y, t)             //更简单的缩写
    #define OLEDsp(y, t, var)   OLEDsprint(0, y, t, var)        //更简单的缩写

    #define OLEDprint(x, y, t)  OLED_P6x8Str(x, y, t)
    #define OLEDprintB(x, y, t) OLED_P8x16Str(x, y, t)
    #define OLEDsprint(x, y, t, var) \
        sprintf(txt, t, var);        \
        OLED_P6x8Str(x, y, txt)
    #define OLEDsprint2(x, y, t, var1, var2) \
        sprintf(txt, t, var1, var2);         \
        OLED_P6x8Str(x, y, txt)

    /*--------------------------- 无线串口 ------------------------------*/
    #define UARTprint(t)        uart_putstr(UART_1, t)
    #define UARTsprint(t, var) \
        sprintf(txt, t, var);  \
        uart_putstr(UART_1, txt)
    #define UARTsprint2(t, var1, var2) \
        sprintf(txt, t, var1, var2);   \
        uart_putstr(UART_1, txt)
    //限幅
    #define set_Bound(x, num) set_bound(x, -num, num)

    #define set_bound(x, low, high) \
        if (x < low)                \
            x = low;                \
        if (x > high)               \
            x = high
    /*--------------------------- Tennikl定义 ------------------------------*/
    //常用定义
    #define Max(a, b)   ((a, b) ? a : b)    //比大小，给出大的值
    #define Min(a, b)   ((a, b) ? b : a)    //比大小，给出小的值
    #define Abs(a)      ((a, 0) ? a : -a)   //绝对值

    //主板切换用宏定义 [1：学习板；2：自制主板]
    #define mainboard_type 2
    #if (mainboard_type == 1)
        #define UseLeaningboard //使用学习板
    #elif (mainboard_type == 2)
        #define UseDiyboard     //使用自制主板
    #endif
    //不同主板分流宏
    // #if defined UseLeaningboard
    // #elif defined UseDiyboard
    // #endif

    //==Global_mode模式定义设定=====================

    // 全局模式设置
    // 0	正常模式	默认模式
    // 1	角度测量	陀螺仪，姿态解算
    // 2	电机测试
    // 3	角速度环
    // 4	角度环
    // 5	速度环
    // 6	图像测试
    extern uint8_t Global_mode;

    #define Normal_mode     0
    #define Gyro_test_mode  1
    #define Motor_test_mode 2
    #define Gyro_loop_test  3
    #define Angle_loop_test 4
    #define Speed_loop_test 5
    #define Image_test_mode 6
    //常量全局预定义
    //===============================================

    //显示模块选择[不可同时定义/往往会冲突]
    #define USEOLED //使用OLED或者TFT1.8模块，默认为TFT1.8
    //#define USETFT  //默认为TFT1.8
    
    //摄像头模块
    #define LQMT9V034    //默认为神眼摄像头
    #define USELQMT9V034 //使用神眼摄像头

    //#define IMAGEH MT9V034_IMAGEH //摄像头采集高度
    //#define IMAGEW MT9V034_IMAGEW //摄像头采集宽度
    #define IMAGEH  120 // 摄像头采集高度
    #define IMAGEW  188 // 摄像头采集宽度
    #define LCDH    64  // 显示高度（用户使用）高度
    #define LCDW    128 // 显示宽度（用户使用）宽度

    // 图像原始数据存放 
    extern unsigned char Image_Data[IMAGEH][IMAGEW];
    // 压缩后之后用于存放屏幕显示数据
    extern unsigned char Image_Use[LCDH][LCDW];
    // 二值化后用于OLED显示的数据
    extern unsigned char Bin_Image[LCDH][LCDW];
    // 固定阈值二值化的阈值
    #define FixedThreshold 10
    
    //图像传输标志位
    // 0: 不进行传输
    // 1: 小豹
    // 2: 山外
    extern uint8_t SendImageFlag;
    
    //电机测试
    #define Motor_test_basic 3000

    //策略方面宏定义
    #define BasicSpeed 50        //基础速度
    #define AddSpeed 70          //找到灯之后的速度
    #define CruisingDir -40
    #define Dirlimit 40

    extern float gyro_y_fliter;

    extern uint8_t ImageFPS;    //图像帧数（每秒）
    extern uint8_t count_1s;    //运行时间（秒）
    extern uint8_t Stop_flag; //停车标志

    extern int testdata[10];
    extern int beishu;

    extern uint8_t StopUse;
    extern uint8_t Location[2]; //灯坐标

    //软件IIC
    #if (mainboard_type == 1)//使用学习板
        #define Tennikl_SCL D10 // 定义SCL引脚  可任意更改为其他IO
        #define Tennikl_SDA D11 // 定义SDA引脚  可任意更改为其他IO
    #elif (mainboard_type == 2)//使用自制主板
        #define Tennikl_SCL D10 // 定义SCL引脚  可任意更改为其他IO
        #define Tennikl_SDA D11 // 定义SDA引脚  可任意更改为其他IO
    #endif

    //确定端口，前进正负
    #if (mainboard_type == 1)//使用学习板
        #define Enc_left() -LQ_Enc_Read(1)
        #define Enc_right() LQ_Enc_Read(2)
    #elif (mainboard_type == 2)//使用自制主板
        #define Enc_left() -LQ_Enc_Read(2)
        #define Enc_right() LQ_Enc_Read(4)
    #endif


    //角速度环控制器选用
    #define Gyro_Loop_PDLocCtrl   //PD位置式
    //#define Gyro_Loop_PIIncCtrl     //PI增量式

#endif